home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / cmds / gawk / sprite / RCS / awk.h,v < prev   
Encoding:
Text File  |  1990-06-28  |  16.6 KB  |  651 lines

  1. head     1.2;
  2. branch   ;
  3. access   ;
  4. symbols  ;
  5. locks    ; strict;
  6. comment  @ * @;
  7.  
  8.  
  9. 1.2
  10. date     90.06.28.15.12.37;  author jhh;  state Exp;
  11. branches ;
  12. next     1.1;
  13.  
  14. 1.1
  15. date     90.03.14.23.38.19;  author jhh;  state Exp;
  16. branches ;
  17. next     ;
  18.  
  19.  
  20. desc
  21. @@
  22.  
  23.  
  24. 1.2
  25. log
  26. @changed def of fseek
  27. @
  28. text
  29. @/*
  30.  * awk.h -- Definitions for gawk. 
  31.  */
  32.  
  33. /* 
  34.  * Copyright (C) 1986, 1988, 1989 the Free Software Foundation, Inc.
  35.  * 
  36.  * This file is part of GAWK, the GNU implementation of the
  37.  * AWK Progamming Language.
  38.  * 
  39.  * GAWK is free software; you can redistribute it and/or modify
  40.  * it under the terms of the GNU General Public License as published by
  41.  * the Free Software Foundation; either version 1, or (at your option)
  42.  * any later version.
  43.  * 
  44.  * GAWK is distributed in the hope that it will be useful,
  45.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  46.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  47.  * GNU General Public License for more details.
  48.  * 
  49.  * You should have received a copy of the GNU General Public License
  50.  * along with GAWK; see the file COPYING.  If not, write to
  51.  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  52.  */
  53.  
  54. /* ------------------------------ Includes ------------------------------ */
  55. #include <stdio.h>
  56. #include <ctype.h>
  57. #include <setjmp.h>
  58. #include <varargs.h>
  59. #include <sys/types.h>
  60. #include <sys/stat.h>
  61. #include <errno.h>
  62.  
  63. #include "regex.h"
  64.  
  65. /* ------------------- System Functions, Variables, etc ------------------- */
  66. /* nasty nasty SunOS-ism */
  67. #ifdef sparc
  68. #include <alloca.h>
  69. #ifdef lint
  70. extern char *alloca();
  71. #endif
  72. #else
  73. extern char *alloca();
  74. #endif
  75. #ifdef SPRINTF_INT
  76. extern int sprintf();
  77. #else    /* not USG */
  78. /* nasty nasty berkelixm */
  79. #define setjmp    _setjmp
  80. #define longjmp    _longjmp
  81.  
  82. extern char *sprintf();
  83. #endif
  84. /*
  85.  * if you don't have vprintf, but you are BSD, the version defined in
  86.  * vprintf.c should do the trick.  Otherwise, use this and cross your fingers.
  87.  */
  88. #if defined(VPRINTF_MISSING) && !defined(DOPRNT_MISSING) && !defined(BSDSTDIO)
  89. #define vfprintf(fp,fmt,arg)    _doprnt((fmt), (arg), (fp))
  90. #endif
  91.  
  92. #ifdef __STDC__
  93. extern void *malloc(unsigned), *realloc(void *, unsigned);
  94. extern void free(char *);
  95. extern char *getenv(char *);
  96.  
  97. extern char *strcpy(char *, char *), *strcat(char *, char *), *strncpy(char *, char *, int);
  98. extern int strcmp(char *, char *);
  99. extern int strncmp(char *, char *, int);
  100. extern int strncasecmp(char *, char *, int);
  101. extern char *strerror(int);
  102. extern char *strchr(char *, int);
  103. extern int strlen(char *);
  104. extern    char *memcpy(char *, char *, int);
  105. extern    int memcmp(char *, char *, int);
  106. extern    char *memset(char *, int, int);
  107.  
  108. /* extern int fprintf(FILE *, char *, ...); */
  109. extern int fprintf();
  110. extern int vfprintf();
  111. #ifndef MSDOS
  112. extern int fwrite(char *, int, int, FILE *);
  113. #endif
  114. extern int fflush(FILE *);
  115. extern int fclose(FILE *);
  116. extern int pclose(FILE *);
  117. #ifndef MSDOS
  118. extern int fputs(char *, FILE *);
  119. #endif
  120. extern void abort();
  121. extern int isatty(int);
  122. extern void exit(int);
  123. extern int system(char *);
  124. extern int sscanf(/* char *, char *, ... */);
  125.  
  126. extern double atof(char *);
  127. extern int fstat(int, struct stat *);
  128. extern off_t lseek(int, off_t, int);
  129. extern long fseek(FILE *, long, int);
  130. extern int close(int);
  131. extern int open();
  132. extern int pipe(int *);
  133. extern int dup2(int, int);
  134. #ifndef MSDOS
  135. extern int unlink(char *);
  136. #endif
  137. extern int fork();
  138. extern int execl(/* char *, char *, ... */);
  139. extern int read(int, char *, int);
  140. extern int wait(int *);
  141. extern void _exit(int);
  142. #else
  143. extern void _exit();
  144. extern int wait();
  145. extern int read();
  146. extern int execl();
  147. extern int fork();
  148. extern int unlink();
  149. extern int dup2();
  150. extern int pipe();
  151. extern int open();
  152. extern int close();
  153. extern int fseek();
  154. extern off_t lseek();
  155. extern int fstat();
  156. extern void exit();
  157. extern int system();
  158. extern int isatty();
  159. extern void abort();
  160. extern int fputs();
  161. extern int fclose();
  162. extern int pclose();
  163. extern int fflush();
  164. extern int fwrite();
  165. extern int fprintf();
  166. extern int vfprintf();
  167. extern int sscanf();
  168. extern char *malloc(), *realloc();
  169. extern void free();
  170. extern char *getenv();
  171.  
  172. extern int strcmp();
  173. extern int strncmp();
  174. extern int strncasecmp();
  175. extern int strlen();
  176. extern char *strcpy(), *strcat(), *strncpy();
  177. extern    char *memset();
  178. extern    int memcmp();
  179. extern    char *memcpy();
  180. extern char *strerror();
  181. extern char *strchr();
  182.  
  183. extern double atof();
  184. #endif
  185.  
  186. #ifndef MSDOS
  187. extern int errno;
  188. #endif    /* MSDOS */
  189.  
  190. /* ------------------ Constants, Structures, Typedefs  ------------------ */
  191. #define AWKNUM    double
  192.  
  193. typedef enum {
  194.     /* illegal entry == 0 */
  195.     Node_illegal,
  196.  
  197.     /* binary operators  lnode and rnode are the expressions to work on */
  198.     Node_times,
  199.     Node_quotient,
  200.     Node_mod,
  201.     Node_plus,
  202.     Node_minus,
  203.     Node_cond_pair,        /* conditional pair (see Node_line_range) */
  204.     Node_subscript,
  205.     Node_concat,
  206.     Node_exp,
  207.  
  208.     /* unary operators   subnode is the expression to work on */
  209. /*10*/    Node_preincrement,
  210.     Node_predecrement,
  211.     Node_postincrement,
  212.     Node_postdecrement,
  213.     Node_unary_minus,
  214.     Node_field_spec,
  215.  
  216.     /* assignments   lnode is the var to assign to, rnode is the exp */
  217.     Node_assign,
  218.     Node_assign_times,
  219.     Node_assign_quotient,
  220.     Node_assign_mod,
  221. /*20*/    Node_assign_plus,
  222.     Node_assign_minus,
  223.     Node_assign_exp,
  224.  
  225.     /* boolean binaries   lnode and rnode are expressions */
  226.     Node_and,
  227.     Node_or,
  228.  
  229.     /* binary relationals   compares lnode and rnode */
  230.     Node_equal,
  231.     Node_notequal,
  232.     Node_less,
  233.     Node_greater,
  234.     Node_leq,
  235. /*30*/    Node_geq,
  236.     Node_match,
  237.     Node_nomatch,
  238.  
  239.     /* unary relationals   works on subnode */
  240.     Node_not,
  241.  
  242.     /* program structures */
  243.     Node_rule_list,        /* lnode is a rule, rnode is rest of list */
  244.     Node_rule_node,        /* lnode is pattern, rnode is statement */
  245.     Node_statement_list,    /* lnode is statement, rnode is more list */
  246.     Node_if_branches,    /* lnode is to run on true, rnode on false */
  247.     Node_expression_list,    /* lnode is an exp, rnode is more list */
  248.     Node_param_list,    /* lnode is a variable, rnode is more list */
  249.  
  250.     /* keywords */
  251. /*40*/    Node_K_if,        /* lnode is conditonal, rnode is if_branches */
  252.     Node_K_while,        /* lnode is condtional, rnode is stuff to run */
  253.     Node_K_for,        /* lnode is for_struct, rnode is stuff to run */
  254.     Node_K_arrayfor,    /* lnode is for_struct, rnode is stuff to run */
  255.     Node_K_break,        /* no subs */
  256.     Node_K_continue,    /* no stuff */
  257.     Node_K_print,        /* lnode is exp_list, rnode is redirect */
  258.     Node_K_printf,        /* lnode is exp_list, rnode is redirect */
  259.     Node_K_next,        /* no subs */
  260.     Node_K_exit,        /* subnode is return value, or NULL */
  261.     Node_K_do,        /* lnode is conditional, rnode stuff to run */
  262.     Node_K_return,
  263.     Node_K_delete,
  264.     Node_K_getline,
  265.     Node_K_function,    /* lnode is statement list, rnode is params */
  266.  
  267.     /* I/O redirection for print statements */
  268.     Node_redirect_output,    /* subnode is where to redirect */
  269.     Node_redirect_append,    /* subnode is where to redirect */
  270.     Node_redirect_pipe,    /* subnode is where to redirect */
  271.     Node_redirect_pipein,    /* subnode is where to redirect */
  272.     Node_redirect_input,    /* subnode is where to redirect */
  273.  
  274.     /* Variables */
  275.     Node_var,        /* rnode is value, lnode is array stuff */
  276.     Node_var_array,        /* array is ptr to elements, asize num of
  277.                  * eles */
  278.     Node_val,        /* node is a value - type in flags */
  279.  
  280.     /* Builtins   subnode is explist to work on, proc is func to call */
  281.     Node_builtin,
  282.  
  283.     /*
  284.      * pattern: conditional ',' conditional ;  lnode of Node_line_range
  285.      * is the two conditionals (Node_cond_pair), other word (rnode place)
  286.      * is a flag indicating whether or not this range has been entered.
  287.      */
  288.     Node_line_range,
  289.  
  290.     /*
  291.      * boolean test of membership in array lnode is string-valued
  292.      * expression rnode is array name 
  293.      */
  294.     Node_in_array,
  295.  
  296.     Node_func,        /* lnode is param. list, rnode is body */
  297.     Node_func_call,        /* lnode is name, rnode is argument list */
  298.  
  299.     Node_cond_exp,        /* lnode is conditonal, rnode is if_branches */
  300.     Node_regex,
  301.     Node_hashnode,
  302.     Node_ahash,
  303. } NODETYPE;
  304.  
  305. /*
  306.  * NOTE - this struct is a rather kludgey -- it is packed to minimize
  307.  * space usage, at the expense of cleanliness.  Alter at own risk.
  308.  */
  309. typedef struct exp_node {
  310.     union {
  311.         struct {
  312.             union {
  313.                 struct exp_node *lptr;
  314.                 char *param_name;
  315.                 char *retext;
  316.                 struct exp_node *nextnode;
  317.             } l;
  318.             union {
  319.                 struct exp_node *rptr;
  320.                 struct exp_node *(*pptr) ();
  321.                 struct re_pattern_buffer *preg;
  322.                 struct for_loop_header *hd;
  323.                 struct exp_node **av;
  324.                 int r_ent;    /* range entered */
  325.             } r;
  326.             char *name;
  327.             short number;
  328.             unsigned char recase;
  329.         } nodep;
  330.         struct {
  331.             AWKNUM fltnum;    /* this is here for optimal packing of
  332.                      * the structure on many machines
  333.                      */
  334.             char *sp;
  335.             short slen;
  336.             unsigned char sref;
  337.         } val;
  338.         struct {
  339.             struct exp_node *next;
  340.             char *name;
  341.             int length;
  342.             struct exp_node *value;
  343.         } hash;
  344. #define    hnext    sub.hash.next
  345. #define    hname    sub.hash.name
  346. #define    hlength    sub.hash.length
  347. #define    hvalue    sub.hash.value
  348.         struct {
  349.             struct exp_node *next;
  350.             struct exp_node *name;
  351.             struct exp_node *value;
  352.         } ahash;
  353. #define    ahnext    sub.ahash.next
  354. #define    ahname    sub.ahash.name
  355. #define    ahvalue    sub.ahash.value
  356.     } sub;
  357.     NODETYPE type;
  358.     unsigned char flags;
  359. #            define    MEM    0x7
  360. #            define    MALLOC    1    /* can be free'd */
  361. #            define    TEMP    2    /* should be free'd */
  362. #            define    PERM    4    /* can't be free'd */
  363. #            define    VAL    0x18
  364. #            define    NUM    8    /* numeric value is valid */
  365. #            define    STR    16    /* string value is valid */
  366. #            define    NUMERIC    32    /* entire field is numeric */
  367. } NODE;
  368.  
  369. #define lnode    sub.nodep.l.lptr
  370. #define nextp    sub.nodep.l.nextnode
  371. #define rnode    sub.nodep.r.rptr
  372. #define source_file    sub.nodep.name
  373. #define    source_line    sub.nodep.number
  374. #define    param_cnt    sub.nodep.number
  375. #define param    sub.nodep.l.param_name
  376.  
  377. #define subnode    lnode
  378. #define proc    sub.nodep.r.pptr
  379.  
  380. #define reexp    lnode
  381. #define rereg    sub.nodep.r.preg
  382. #define re_case sub.nodep.recase
  383. #define re_text sub.nodep.l.retext
  384.  
  385. #define forsub    lnode
  386. #define forloop    rnode->sub.nodep.r.hd
  387.  
  388. #define stptr    sub.val.sp
  389. #define stlen    sub.val.slen
  390. #define stref    sub.val.sref
  391. #define    valstat    flags
  392.  
  393. #define numbr    sub.val.fltnum
  394.  
  395. #define var_value lnode
  396. #define var_array sub.nodep.r.av
  397.  
  398. #define condpair lnode
  399. #define triggered sub.nodep.r.r_ent
  400.  
  401. #define HASHSIZE 101
  402.  
  403. typedef struct for_loop_header {
  404.     NODE *init;
  405.     NODE *cond;
  406.     NODE *incr;
  407. } FOR_LOOP_HEADER;
  408.  
  409. /* for "for(iggy in foo) {" */
  410. struct search {
  411.     int numleft;
  412.     NODE **arr_ptr;
  413.     NODE *bucket;
  414.     NODE *retval;
  415. };
  416.  
  417. /* for faster input, bypass stdio */
  418. typedef struct iobuf {
  419.     int fd;
  420.     char *buf;
  421.     char *off;
  422.     int size;    /* this will be determined by an fstat() call */
  423.     int cnt;
  424.     char *secbuf;
  425.     int secsiz;
  426.     int flag;
  427. #    define        IOP_IS_TTY    1
  428. } IOBUF;
  429.  
  430. /*
  431.  * structure used to dynamically maintain a linked-list of open files/pipes
  432.  */
  433. struct redirect {
  434.     int flag;
  435. #        define        RED_FILE    1
  436. #        define        RED_PIPE    2
  437. #        define        RED_READ    4
  438. #        define        RED_WRITE    8
  439. #        define        RED_APPEND    16
  440. #        define        RED_NOBUF    32
  441.     char *value;
  442.     FILE *fp;
  443.     IOBUF *iop;
  444.     int pid;
  445.     int status;
  446.     long offset;        /* used for dynamic management of open files */
  447.     struct redirect *prev;
  448.     struct redirect *next;
  449. };
  450.  
  451. /* longjmp return codes, must be nonzero */
  452. /* Continue means either for loop/while continue, or next input record */
  453. #define TAG_CONTINUE 1
  454. /* Break means either for/while break, or stop reading input */
  455. #define TAG_BREAK 2
  456. /* Return means return from a function call; leave value in ret_node */
  457. #define    TAG_RETURN 3
  458.  
  459. #ifdef MSDOS
  460. #define HUGE    0x7fff
  461. #else
  462. #define HUGE    0x7fffffff
  463. #endif
  464.  
  465. /* -------------------------- External variables -------------------------- */
  466. /* gawk builtin variables */
  467. extern NODE *FS_node, *NF_node, *RS_node, *NR_node;
  468. extern NODE *FILENAME_node, *OFS_node, *ORS_node, *OFMT_node;
  469. extern NODE *FNR_node, *RLENGTH_node, *RSTART_node, *SUBSEP_node;
  470. extern NODE *IGNORECASE_node;
  471.  
  472. extern NODE **stack_ptr;
  473. extern NODE *Nnull_string;
  474. extern NODE *deref;
  475. extern NODE **fields_arr;
  476. extern int sourceline;
  477. extern char *source;
  478. extern NODE *expression_value;
  479.  
  480. extern NODE *variables[];
  481.  
  482. extern NODE *_t;    /* used as temporary in tree_eval */
  483.  
  484. extern char *myname;
  485.  
  486. extern int node0_valid;
  487. extern int field_num;
  488. extern int strict;
  489.  
  490. /* ------------------------- Pseudo-functions ------------------------- */
  491. #define is_identchar(c) (isalnum(c) || (c) == '_')
  492.  
  493.  
  494. #define    free_temp(n)    if ((n)->flags&TEMP) { deref = (n); do_deref(); } else
  495. #define    tree_eval(t)    (_t = (t),(_t) == NULL ? Nnull_string : \
  496.             ((_t)->type == Node_val ? (_t) : r_tree_eval((_t))))
  497. #define    make_string(s,l)    make_str_node((s),(l),0)
  498.  
  499. #define    cant_happen()    fatal("line %d, file: %s; bailing out", \
  500.                 __LINE__, __FILE__);
  501. #ifdef MEMDEBUG
  502. #define memmsg(x,y,z,zz)    fprintf(stderr, "malloc: %s: %s: %d %0x\n", z, x, y, zz)
  503. #define free(s)    fprintf(stderr, "free: s: %0x\n", s), do_free(s)
  504. #else
  505. #define memmsg(x,y,z,zz)
  506. #endif
  507.  
  508. #define    emalloc(var,ty,x,str)    if ((var = (ty) malloc((unsigned)(x))) == NULL)\
  509.                     fatal("%s: %s: can't allocate memory (%s)",\
  510.                     (str), "var", strerror(errno)); else\
  511.                     memmsg("var", x, str, var)
  512. #define    erealloc(var,ty,x,str)    if((var=(ty)realloc((char *)var,\
  513.                         (unsigned)(x)))==NULL)\
  514.                     fatal("%s: %s: can't allocate memory (%s)",\
  515.                     (str), "var", strerror(errno)); else\
  516.                     memmsg("re: var", x, str, var)
  517. #ifdef DEBUG
  518. #define    force_number    r_force_number
  519. #define    force_string    r_force_string
  520. #else
  521. #ifdef lint
  522. extern AWKNUM force_number();
  523. #endif
  524. #ifdef MSDOS
  525. extern double _msc51bug;
  526. #define    force_number(n)    (_msc51bug=(_t = (n),(_t->flags & NUM) ? _t->numbr : r_force_number(_t)))
  527. #else
  528. #define    force_number(n)    (_t = (n),(_t->flags & NUM) ? _t->numbr : r_force_number(_t))
  529. #endif
  530. #define    force_string(s)    (_t = (s),(_t->flags & STR) ? _t : r_force_string(_t))
  531. #endif
  532.  
  533. #define    STREQ(a,b)    (*(a) == *(b) && strcmp((a), (b)) == 0)
  534. #define    STREQN(a,b,n)    ((n) && *(a) == *(b) && strncmp((a), (b), (n)) == 0)
  535.  
  536. #define    WHOLELINE    (node0_valid ? fields_arr[0] : *get_field(0,0))
  537.  
  538. /* ------------- Function prototypes or defs (as appropriate) ------------- */
  539. #ifdef __STDC__
  540. extern    int parse_escape(char **);
  541. extern    int devopen(char *, char *);
  542. extern    struct re_pattern_buffer *make_regexp(NODE *, int);
  543. extern    struct re_pattern_buffer *mk_re_parse(char *, int);
  544. extern    NODE *variable(char *);
  545. extern    NODE *install(NODE **, char *, NODE *);
  546. extern    NODE *lookup(NODE **, char *);
  547. extern    NODE *make_name(char *, NODETYPE);
  548. extern    int interpret(NODE *);
  549. extern    NODE *r_tree_eval(NODE *);
  550. extern    void assign_number(NODE **, double);
  551. extern    int cmp_nodes(NODE *, NODE *);
  552. extern    struct redirect *redirect(NODE *, int *);
  553. extern    int flush_io(void);
  554. extern    void print_simple(NODE *, FILE *);
  555. /* extern    void warning(char *,...); */
  556. extern    void warning();
  557. /* extern    void fatal(char *,...); */
  558. extern    void fatal();
  559. extern    void set_record(char *, int);
  560. extern    NODE **get_field(int, int);
  561. extern    NODE **get_lhs(NODE *, int);
  562. extern    void do_deref(void );
  563. extern    struct search *assoc_scan(NODE *);
  564. extern    struct search *assoc_next(struct search *);
  565. extern    NODE **assoc_lookup(NODE *, NODE *);
  566. extern    double r_force_number(NODE *);
  567. extern    NODE *r_force_string(NODE *);
  568. extern    NODE *newnode(NODETYPE);
  569. extern    NODE *dupnode(NODE *);
  570. extern    NODE *make_number(double);
  571. extern    NODE *tmp_number(double);
  572. extern    NODE *make_str_node(char *, int, int);
  573. extern    NODE *tmp_string(char *, int);
  574. extern    char *re_compile_pattern(char *, int, struct re_pattern_buffer *);
  575. extern    int re_search(struct re_pattern_buffer *, char *, int, int, int, struct re_registers *);
  576. extern    void freenode(NODE *);
  577.  
  578. #else
  579. extern    int parse_escape();
  580. extern    void freenode();
  581. extern    int devopen();
  582. extern    struct re_pattern_buffer *make_regexp();
  583. extern    struct re_pattern_buffer *mk_re_parse();
  584. extern    NODE *variable();
  585. extern    NODE *install();
  586. extern    NODE *lookup();
  587. extern    int interpret();
  588. extern    NODE *r_tree_eval();
  589. extern    void assign_number();
  590. extern    int cmp_nodes();
  591. extern    struct redirect *redirect();
  592. extern    int flush_io();
  593. extern    void print_simple();
  594. extern    void warning();
  595. extern    void fatal();
  596. extern    void set_record();
  597. extern    NODE **get_field();
  598. extern    NODE **get_lhs();
  599. extern    void do_deref();
  600. extern    struct search *assoc_scan();
  601. extern    struct search *assoc_next();
  602. extern    NODE **assoc_lookup();
  603. extern    double r_force_number();
  604. extern    NODE *r_force_string();
  605. extern    NODE *newnode();
  606. extern    NODE *dupnode();
  607. extern    NODE *make_number();
  608. extern    NODE *tmp_number();
  609. extern    NODE *make_str_node();
  610. extern    NODE *tmp_string();
  611. extern    char *re_compile_pattern();
  612. extern    int re_search();
  613. #endif
  614.  
  615. #if !defined(__STDC__) || __STDC__ <= 0
  616. #define volatile
  617. #endif
  618.  
  619. /* Figure out what '\a' really is. */
  620. #ifdef __STDC__
  621. #define BELL    '\a'        /* sure makes life easy, don't it? */
  622. #else
  623. #    if 'z' - 'a' == 25    /* ascii */
  624. #        if 'a' != 97    /* machine is dumb enough to use mark parity */
  625. #            define BELL    '\207'
  626. #        else
  627. #            define BELL    '\07'
  628. #        endif
  629. #    else
  630. #        define BELL    '\057'
  631. #    endif
  632. #endif
  633.  
  634. #ifndef SIGTYPE
  635. #define SIGTYPE    void
  636. #endif
  637.  
  638. extern char casetable[];    /* for case-independent regexp matching */
  639. @
  640.  
  641.  
  642. 1.1
  643. log
  644. @Initial revision
  645. @
  646. text
  647. @d101 1
  648. a101 1
  649. extern int fseek(FILE *, long, int);
  650. @
  651.